export const CONDITION_WIDTH = 48; // 条件div的高度
export const CONDITION_GAP = 24; // 上下两个条件div之间的间隙

export const ROOT_SPACING = 44; // 左右节点的间距
export const PARENT_CHILD_DISTANCE = 48 + ROOT_SPACING; // 子节点和父节点的水平X轴上的距离,48是宽，44是间距
export const NodeAnd = 'h';
export const NodeOr = 'o';
export const NodeCondition = 'c';
export const NodePlain = 't';

export interface MoveType {
  MoveSNode: SNode;
  AddOrMove: boolean; // true为新增
}

export interface Condition {
  Operate: string; //
  Field: string;
  Value: string;
  PlainText: string;
}

export interface NodeData {
  Conditions: Condition;
  ColumnNames: string[]; // 列的所有名称，用来弹出框中的下拉选项
  IsSvgDisplay: boolean; // svg线条是否显示,true为显示
  IsDisplay: boolean; // 除线条之外是否显示
  IsExistele: boolean; // 该点是否有收缩，true为有
  IsMarkDisplay: boolean; // 遮罩层是否显示，true为显示
}

export class SNode {
  Children: SNode[];
  NodeType: string; // 沿用后端规则
  Parent: SNode;
  Status: string; // 节点状态，普通-n,选中-select,复制-copy,剪切-cut
  Data: NodeData;
  constructor() {
    this.Children = [];
  }
  // 在传入的节点新增一个节点,con判断节点类型，无条件内容就是连接节点，idx选择插入位置
  public AddChildNode(nd: SNode, idx?: number) {
    if (idx) {
      this.Children.splice(idx, 0, nd);
    } else {
      this.Children.push(nd);
    }
  }
  // 删除一个节点
  public Delete(): boolean {
    if (this.Parent) {
      const ld = this.Parent.Children.indexOf(this);
      this.Parent.Children.splice(ld, 1);
      return true;
    } else {
      alert('根节点无法删除');
      return false;
    }
  }
  // 求出逻辑高度，即末级叶子的高度数量
  public GetLogicHeight(): number {
    // 如果本节点是叶子节点，返回1
    if (this.Children.length === 0) {
      return 1;
    }
    let rev = 0;
    this.Children.forEach(v => (rev += v.GetLogicHeight()));
    return rev;
  }

  // 向上冒泡，删除无条件的单独连接节点,预留这个函数，看实际情况是否全部删除
  DeleteOrphanNode() {
    let rev: SNode = this;
    while (rev.Parent) {
      const bn: SNode = rev;
      rev = rev.Parent;
      bn.deleteOrphanNode();
    }
  }
  // 删除只有一个孩子的连接节点,这个应该改成向上冒泡
  deleteOrphanNode() {
    const sourceNode = this;
    if (sourceNode.Parent && sourceNode.Children.length === 1) {
      const idx = sourceNode.Parent.Children.indexOf(sourceNode.Parent);
      sourceNode.Parent.Children.splice(idx, 0, sourceNode.Children[0]);
      sourceNode.Children[0].Parent = sourceNode.Parent;
      sourceNode.Delete();
    }
  }
}
